<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
<script>

//【示例1】类的静态成员（属性和方法）包括私有和公共两种类型，不管是公共还是私有，它们在系统中只有一份副本，也就是说它们不会被分成多份传递给不同的对象，而是通过函数指针进行引用。
var F = (function(){// 把闭包体（外层函数）赋值给变量F，返回一个构造函数（内层函数）
    var _a = 1; 	// 闭包体的私有变量
    this.a = _a; 	// 闭包体内公共属性a
    this.get1 =function(){	// 闭包体内公共方法get1()
        return _a;
    };
    this.set1 = function(x){ 	// 闭包体内公共方法set1()
        _a = x;
    };
    return function(){	// 返回的构造函数类
       this.get2 =function(){	// 返回的公共方法get2()，可以访问私有变量
           return _a;
       };
       this.set2 = function(x){	// 返回的公共方法set2(x)，可以访问私有变量
           _a = x;
        };
    } 
})();	// 执行闭包体，返回匿名构造函数结构
// 定义类的静态公共方法和属性
F.get3 =function(){	// 静态公共方法get3()，返回对公共方法get1 ()的调用
    return get1();
};
F.set3 = function(x){ 	// 静态公共方法set3()，返回对公共方法set1 (x)的调用
     set1(x);
}
F.a = a; 	// 静态公共私有属性a
//【示例2】与一般类的创建方法一样，这里的私有成员和特权成员仍然被声明在构造器（即构造函数）中，并借助var和this关键字来实现。但构造器却由原来的普通函数变成了一个内嵌函数，并且作为外层函数的返回值赋值给了变量F，这就创建了一个闭包。在这个闭包中，还可以声明静态私有成员。
var F = (function(){
    function set5(x){ 	// 静态私有方法
        _a = x;
    }
    function get5(){	// 静态私有方法
        return _a;
    }
})();
//【示例3】访问静态成员。
alert(F.get3());	// 直接访问类F的静态方法get3()，返回1
alert(F.a); 	// 直接访问类F的静态属性a，返回1
F.set3(2); 	// 访问类静态方法set3()，修改私有变量的值
alert(F.get3());	// 返回2，说明修改成功
//
var a = new F()	// 实例化类F
alert(a.get2());	// 调用类F的公共方法get2()，返回1
a.set2(2); 	// 调用类F的公共方法set2()，修改私有变量_a
alert(a.get2());	// 调用类F的公共方法get2()，返回2
//【示例4】但是下面的用法都是错误的。因为闭包体内的变量、属性和方法（不管是私有还是公共的），对于级别比较低的F类来说是无权访问的（F是返回的匿名构造函数）：
var a = new F()
alert(a.get1());
a.set1(2);
alert(a.get1());
//
F.prototype = {	// 类F的原型对象
    get4 : function(){	// 原型方法get4()
        return get1();	// 访问闭包内数据
    },
    set4 : function(x){ 	// 原型方法set4()
        set1(x); 	// 访问闭包内数据
    }
};
var a = new F();	// 实例化类F
alert(a.get4());	// 返回1



</script>
</head>

<body>
</body>
</html>
